package dataediter;

import main.Resource;

import java.util.ArrayList;

/**
 * 数据文件的读写
 *
 * @author fdh
 */
public class DataWR extends FileWRBase {
    private String filePath;

    public interface SearchData {
        /**
         * 返回行进行判断。返回为true时回调结束
         *
         * @param line 需要判断的行
         * @return 是否结束
         */
        boolean search(String line);
    }

    public DataWR(String filePath) throws Exception {
        if (!filePath.contains("." + Resource.DataFile.Maker.suffixName)) {
            throw new Exception(filePath + ",表格文件读取失败,请检查后缀名");
        }
        this.filePath = filePath;
    }

    public DataWR() {
        filePath = Resource.DataFile.dataPath;
    }

    /**
     * 设置需要处理的文件路径
     *
     * @param filePath
     * @throws Exception 文件读取失败,检查后缀名
     */
    public void setFilePath(String filePath) throws Exception {
        if (!filePath.contains("." + Resource.DataFile.Maker.suffixName)) {
            throw new Exception(filePath + ",表格文件读取失败,请检查后缀名");
        }
        this.filePath = filePath;
    }

    /**
     * 设置默认路径下需要处理的文件名字
     *
     * @param fileName
     */
    public void setFileName(String fileName) {
        this.filePath = Resource.DataFile.dataPath + fileName + "." + Resource.DataFile.Maker.suffixName;
    }

    /**
     * 把数据写入文件
     *
     * @param data       需要写入的数据
     * @param targetLine 目标位置
     */
    public void writeToFile(String data, String targetLine) {
        super.writeInfoToTargetLine(filePath, new WriteInfo() {
            @Override
            public boolean search(String line) {
                return line.equals(targetLine);
            }

            @Override
            public String write() {
                return data;
            }
        });
    }

    /**
     * 读取指定的数据区域
     *
     * @param startLine 开始行
     * @param endLine   结束行
     * @return 指定数据
     */
    public ArrayList<String> readData(String startLine, String endLine) {
        return super.readAll(filePath, new ReadAll() {
            @Override
            public boolean start(String line) {
                return line.equals(startLine);
            }

            @Override
            public boolean end(String line) {
                return line.equals(endLine);
            }
        });
    }

    /**
     * 判断区间是否有此数据
     *
     * @param startLine  开始行
     * @param endLine    结束行
     * @param searchData 寻找的数据的回调函数
     */
    public boolean haveData(String startLine, String endLine, SearchData searchData) {
        ArrayList<String> allDatas = readData(startLine, endLine);
        for (String s : allDatas) {
            if (searchData.search(s)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 读取指定路径下的数据文件
     *
     * @param path      指定路径
     * @param fileNames 存储文件名字
     */
    public static void scanDatasFromPath(String path, ArrayList<String> fileNames) {
        FileWRBase.scanDirectory(path, Resource.DataFile.Maker.suffixName, fileNames);
    }

    /**
     * 读取默认路径下的数据文件
     *
     * @param fileNames 存储文件名字
     */
    public static void scanDatasFromPath(ArrayList<String> fileNames) {
        FileWRBase.scanDirectory(Resource.DataFile.dataPath, Resource.DataFile.Maker.suffixName, fileNames);
    }

    /**
     * 创建指定名字的保存数据的文件
     *
     * @param fileName 文件名字
     */
    @Override
    public boolean createFile(String fileName) {
        return super.createFile(Resource.DataFile.dataPath + fileName.trim() + "." + Resource.DataFile.Maker.suffixName);
    }

    /**
     * 通过文件删除,包括后缀名
     *
     * @param file 路径
     * @return 是否成功删除
     */
    @Override
    public boolean delFile(String file) {
        return super.delFile(Resource.DataFile.dataPath + file);
    }

    /**
     * 通过文件名字删除,不包括后缀名
     *
     * @param fileName
     * @return
     */
    public boolean delFileByName(String fileName) {
        return super.delFile(Resource.DataFile.dataPath + fileName + "." + Resource.DataFile.Maker.suffixName);
    }
}
